﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Web.UI.WebControls;
using Classes.Conec;
using Classes.Model.Entidade;

namespace Classes.Model.Dao
{
    public class GeneroDAO
    {
        private const String SQL_INSERT = "INSERT INTO GENERO (DESCRICAO) VALUES (@DESCRICAO)";
        private const String SQL_UPDATE = "UPDATE GENERO SET DESCRICAO = @NOVA_DESCRICAO WHERE (ID_GENERO = @ID_NOVA)";
        private const String SQL_DELETE = "DELETE GENERO WHERE ID_STATUS = @ID";
        private const String SQL_SELECT_ID = "SELECT * FROM GENERO WHERE ID_GENERO = @ID";
        private const String SQL_SELECT = "SELECT ID_GENERO, DESCRICAO FROM GENERO";
        private static GeneroDAO genero;

        public static GeneroDAO getInstance()
        {
            if (genero == null)
            {
                genero = new GeneroDAO();
            }
            return genero;
        }

        public String deletar(int id)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_DELETE, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.AddWithValue("@ID", id);
                    executar_comando.ExecuteNonQuery();
                    return "Categoria deletada com sucesso !";
                }
                catch (Exception o)
                {
                    return "Erro ao excluir ! " + o.Message;
                }
            }
        }

        public String inserir(Entidade.GeneroDTO genero)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_INSERT, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.AddWithValue("@descricao", genero.Descricao);
                    executar_comando.ExecuteNonQuery();
                    return "Inclusão realizada com sucesso";
                }
                catch (Exception o)
                {
                    return "Erro na inclusão " + o.Message;
                }
            }
        }

        public String atualizar(Entidade.GeneroDTO genero)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_UPDATE, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.Add("@NOVA_DESCRICAO", System.Data.SqlDbType.VarChar, 100).Value = genero.Descricao;
                    executar_comando.Parameters.Add("@ID_NOVA", System.Data.SqlDbType.Int, 10).Value = genero.Id_genero;
                    executar_comando.ExecuteNonQuery();
                    return "Atualização realizada com sucesso";
                }
                catch (SqlException sq)
                {
                    return "Erro na atualização: " + sq.Message;
                }
                catch (Exception ex)
                {
                    return "Erro na atualização: " + ex.Message;
                }
            }
        }

        public List<Entidade.GeneroDTO> select()
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                List<Entidade.GeneroDTO> genero = new List<Entidade.GeneroDTO>();
                SqlCommand executar_comando = new SqlCommand(SQL_SELECT, conn);
                try
                {
                    conn.Open();
                    SqlDataReader reader = executar_comando.ExecuteReader();
                    while (reader.Read())
                    {
                        var nome = reader.GetValue(1);
                        var id = reader.GetValue(0);
                        Entidade.GeneroDTO gen = new Entidade.GeneroDTO(Convert.ToUInt16(id), Convert.ToString(nome));
                        genero.Add(gen);
                        gen = null;
                        //categorias.Add(new Entidade.CategoriaDTO(reader.GetInt16(1),reader.GetString(2)));
                    }
                    reader.Close();
                    return genero;
                }
                catch (Exception)
                {
                    return genero;
                }
            }
        }

        public GeneroDTO select(int id_gen)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_SELECT_ID, conn);
                GeneroDTO gen = null;
                try
                {
                    conn.Open();
                    executar_comando.Parameters.Add("@ID", System.Data.SqlDbType.Int, 10).Value = id_gen;
                    SqlDataReader reader = executar_comando.ExecuteReader();
                    while (reader.Read())
                    {
                        var nome = reader.GetValue(1);
                        var id = reader.GetValue(0);
                        gen = new Entidade.GeneroDTO(Convert.ToUInt16(id), Convert.ToString(nome));
                    }
                    reader.Close();
                    return gen;
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }
    }
}
